// utils/cloud/cloudService.js
/**
 * 云开发服务管理
 * 统一管理所有云函数调用
 */

const ENV_ID = 'cloud1-3gew2xhnadfbd1bd'

class CloudService {
  constructor() {
    this.isCloudEnabled = false
    this.initCloud()
  }

  /**
   * 初始化云开发环境
   */
  initCloud() {
    try {
      if (!wx.cloud) {
        console.error('请使用 2.2.3 或以上的基础库以使用云能力')
        return false
      }
      
      wx.cloud.init({
        env: ENV_ID,
        traceUser: true
      })
      
      this.isCloudEnabled = true
      console.log('云开发环境初始化成功:', ENV_ID)
      return true
    } catch (err) {
      console.error('云开发初始化失败:', err)
      return false
    }
  }

  /**
   * 用户登录
   * @param {Object} userInfo - 用户信息 {nickName, avatarUrl, gender}
   */
  async login(userInfo = {}) {
    if (!this.isCloudEnabled) {
      return { success: false, error: '云开发未启用' }
    }

    try {
      const result = await wx.cloud.callFunction({
        name: 'login',
        data: {
          nickName: userInfo.nickName,
          avatarUrl: userInfo.avatarUrl,
          gender: userInfo.gender
        }
      })

      if (result.result.success) {
        // 保存用户信息到本地
        wx.setStorageSync('cloudUserInfo', result.result.data)
        console.log('云端登录成功:', result.result.data)
      }

      return result.result
    } catch (err) {
      console.error('云端登录失败:', err)
      return { success: false, error: err.message }
    }
  }

  /**
   * 更新用户信息
   * @param {Object} userInfo - 要更新的用户信息
   */
  async updateUserInfo(userInfo) {
    if (!this.isCloudEnabled) {
      return { success: false, error: '云开发未启用' }
    }

    try {
      const result = await wx.cloud.callFunction({
        name: 'updateUserInfo',
        data: userInfo
      })

      if (result.result.success) {
        // 更新本地缓存
        const localInfo = wx.getStorageSync('cloudUserInfo') || {}
        wx.setStorageSync('cloudUserInfo', {
          ...localInfo,
          ...userInfo
        })
      }

      return result.result
    } catch (err) {
      console.error('更新用户信息失败:', err)
      return { success: false, error: err.message }
    }
  }

  /**
   * 同步游戏记录到云端
   * @param {Object} gameRecord - 游戏记录
   */
  async syncGameRecord(gameRecord) {
    if (!this.isCloudEnabled) {
      console.warn('云开发未启用，游戏记录仅保存在本地')
      return { success: false, error: '云开发未启用' }
    }

    try {
      const result = await wx.cloud.callFunction({
        name: 'syncGameRecord',
        data: {
          gameRecord: gameRecord
        }
      })

      if (result.result.success) {
        console.log('游戏记录同步成功:', result.result.data)
        
        // 如果升级了，显示提示
        if (result.result.data.levelUp) {
          wx.showToast({
            title: `恭喜升到 ${result.result.data.newLevel} 级！`,
            icon: 'success',
            duration: 2000
          })
        }
      }

      return result.result
    } catch (err) {
      console.error('同步游戏记录失败:', err)
      return { success: false, error: err.message }
    }
  }

  /**
   * 获取本地缓存的云端用户信息
   */
  getLocalCloudUserInfo() {
    return wx.getStorageSync('cloudUserInfo') || null
  }

  /**
   * 清除本地云端用户信息（登出）
   */
  clearLocalCloudUserInfo() {
    wx.removeStorageSync('cloudUserInfo')
  }

  /**
   * 检查是否已登录云端
   */
  isCloudLoggedIn() {
    const userInfo = this.getLocalCloudUserInfo()
    return userInfo && userInfo.openId
  }

  /**
   * 获取用户 openId
   */
  async getUserOpenId() {
    if (!this.isCloudEnabled) {
      return { success: false, error: '云开发未启用' }
    }

    try {
      const result = await wx.cloud.callFunction({
        name: 'getUserOpenId'
      })

      return result.result
    } catch (err) {
      console.error('获取openId失败:', err)
      return { success: false, error: err.message }
    }
  }

  /**
   * 上传头像到云存储
   * @param {String} filePath - 本地文件路径
   * @param {String} openId - 用户openId
   */
  async uploadAvatar(filePath, openId) {
    if (!this.isCloudEnabled) {
      return { success: false, error: '云开发未启用' }
    }

    try {
      // 获取文件扩展名
      const extName = filePath.substring(filePath.lastIndexOf('.'))
      const cloudPath = `avatars/${openId}${extName}`

      // 上传文件
      const uploadResult = await wx.cloud.uploadFile({
        cloudPath: cloudPath,
        filePath: filePath
      })

      if (uploadResult.fileID) {
        console.log('头像上传成功:', uploadResult.fileID)
        return {
          success: true,
          fileID: uploadResult.fileID
        }
      } else {
        return {
          success: false,
          error: '上传失败'
        }
      }
    } catch (err) {
      console.error('上传头像失败:', err)
      return { success: false, error: err.message }
    }
  }
}

// 导出单例
const cloudService = new CloudService()
module.exports = cloudService
